// Copyright © 2020 The Things Network Foundation, The Things Industries B.V.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * Allows React components to use the render-prop pattern without explicitly
 * specifying `render` or `children` as function props.
 *
 * @template C
 * @typedef {object} RenderCallbackProps
 * @property {(context: C) => unknown} [render] - Render function.
 * @property {unknown | ((context: C) => unknown)} [children] - Children or a render function.
 */

/**
 * @template C
 * @param {RenderCallbackProps<C>} props - The component props.
 * @param {C} context - The context passed to the render/children function.
 * @returns {unknown} - The result of `render(context)`, `children(context)`, or `children`.
 */
const renderCallback = ({ render, children }, context) => {
  if (render) {
    return render(context)
  } else if (typeof children === 'function') {
    return children(context)
  }

  return children
}

export default renderCallback
